package com.anteater.eattheant.util;

import android.content.Context;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;

public class SoundPlayer {

	private static SoundPlayer sp;
	private MediaPlayer mp;
	private MediaPlayer mpBackground;
	
	private boolean soundEnable = true;

	private SoundPlayer() {
	}

	public static SoundPlayer getInstance() {
		if (sp == null) {
			sp = new SoundPlayer();
		}
		return sp;
	}

	public int getCurrentDuration() {
		if (mp != null) {
			return mp.getDuration();
		}
		return 0;
	}

	/**
	 * Inicia um som em background caso ele já nao esteja tocando
	 */
	public void playInBackground(Context ctx, int resId) {
		if (mpBackground == null) {
			mpBackground = MediaPlayer.create(ctx, resId);
			mpBackground.setLooping(true);
			play(mpBackground);
		}
		if (mpBackground != null) {
			if (!mpBackground.isPlaying()) {
				mpBackground = MediaPlayer.create(ctx, resId);
				mpBackground.setLooping(true);
				play(mpBackground);
			}
		}
	}

	/**
	 * Toca o som sem parar a música de bakground
	 */
	public void quickSound(Context ctx, int resId) {
		play(ctx, resId, false, false);
	}

	/**
	 * Para de executar o background antes de tocar o som especificado
	 */
	public void playSound(Context ctx, int resId) {
		play(ctx, resId, false, true);
	}

	/**
	 * Toca o som e empilha o próximo som, que pode ser tocado em loop ou não
	 */
	public void playNext(final Context ctx, int resId, final int nextSound,
			final boolean loopingNext, final boolean stopBackground) {
		if (mp != null) {
			mp.stop();
		}
		if (mpBackground != null && stopBackground) {
			mpBackground.stop();
		}
		mp = MediaPlayer.create(ctx, resId);
		mp.setOnCompletionListener(new OnCompletionListener() {

			@Override
			public void onCompletion(MediaPlayer mp) {
				play(ctx, nextSound, loopingNext, stopBackground);
			}
		});
		play(mp);
	}

	public boolean isSoundEnable() {
		return soundEnable;
	}
	
	/**
	 * Pausa todos os sons que estiverem tocando no momento
	 */
	public void pauseSounds() {
		if (mp != null && mp.isPlaying()) {
			mp.pause();
		}
		if (mpBackground != null && mpBackground.isPlaying()) {
			mpBackground.pause();
		}
	}
	
	/**
	 * Para todos os sons que estiverem tocando e desativa os sons
	 */
	public void stopSounds() {
		setSoundEnable(false);
		pauseSounds();
	}
	
	/**
	 * Reinicia os sons do aplicativo
	 */
	public void startSounds() {
		setSoundEnable(true);
		if (mpBackground != null) {
			play(mpBackground);
		}
	}

	private void play(Context ctx, int resId, boolean looping,
			boolean stopBackground) {
		if (mp != null) {
			mp.stop();
		}
		if (mpBackground != null && stopBackground) {
			mpBackground.stop();
		}
		mp = MediaPlayer.create(ctx, resId);
		mp.setLooping(looping);
		play(mp);
	}
	
	private void play(MediaPlayer mp) {
		if (isSoundEnable()) {
			mp.start();
		}
	}

	private void setSoundEnable(boolean soundEnable) {
		this.soundEnable = soundEnable;
	}
}
